#include "bootpack.h"

struct FIFO8 keyfifo;

#define KEYSTA_SEND_NOTREADY 0x02
#define KEYCMD_WRITE_MODE 0x60
#define KBC_MODE 0x47			 /* KBC - 键盘控制电路keyboard controller */
#define PORT_KEYSTA 0x0064

void wait_KBC_sendready(void)
{
	/* 等待键盘控制电路准备完毕 */
	for (;;)
	{
		if ((io_in8(PORT_KEYSTA) & KEYSTA_SEND_NOTREADY) == 0)
		{
			break;
		}
	}
	return;
}

void init_keyboard(void)
{
	/* 初始化键盘控制电路 */
	wait_KBC_sendready();
	io_out8(PORT_KEYCMD, KEYCMD_WRITE_MODE);
	wait_KBC_sendready();
	io_out8(PORT_KEYDAT, KBC_MODE); /* 模式设定的指令是0x60，利用鼠标模式的模式号码是0x47 */
	return;
}

/**
 * 来自PS/2键盘的中断
 * 鼠标是IRQ12
 * 键盘是IRQ1
 * harib04b - 将显示工作分离到HariMain，将data暂时保存在keybuf里
 */
void inthandler21(int *esp)
{
    unsigned char data;
    io_out8(PIC0_OCW2, 0x61); /* 通知PIC “IRQ-01已经受理完毕”，将 “0x60+IRQ号码” 输出给OCW2就可以 */
    data = io_in8(PORT_KEYDAT);
    fifo8_put(&keyfifo, data);
    return;
}